#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>

#define NN 64

int main(int argc, char const* argv[])
{
    char buf[NN]={'\0'};
    char text[NN]="client.c";
    int client_socket = socket(AF_INET,SOCK_STREAM,0);
    if (client_socket==-1)
    {
        perror("socket err\n");
        return -1;
    }

    struct sockaddr_in server_addr;
    server_addr.sin_family=AF_INET;
    server_addr.sin_port=htons(8888);
    server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    if(connect(client_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))==-1)
    {
        perror("connect err\n");
        close(client_socket);
        return -1;
    }

    
    // printf("请输入要传输的文件:\n");
    // scanf("%s",text);
    if (strcmp("quit",text)==0)//输入quit退出
    {
        return 0;
    }
    int fd=open(text,O_RDONLY);//打开文件
    if (fd==-1)
    {
        perror("open err\n");
        close(client_socket);
        return -1;
    }
    
    int size=0;//文件大小
    size=lseek(fd,0,SEEK_END);//获取文件长度
    // uint32_t lsize=htonl(size);
    int namelen=0;
    namelen=strlen(text);//获取文件名长度
    uint32_t lnamelen=htonl(namelen);

    lseek(fd,0,SEEK_SET);
    send(client_socket,&lnamelen,sizeof(uint32_t),0);//发送文件名长度
    send(client_socket,text,namelen,0);//发送文件名
    int stemp=send(client_socket,&size,sizeof(int),0);//
    printf("size:%d\n",size);
    // printf("lsize:%u\n",lsize);

    while (1)//循环发送文件
    {
        memset(buf,0,NN);
        int temp=read(fd,buf,NN);
        if(temp>0)
        {
            send(client_socket,buf,temp,0);
            printf("%s",buf);
        }
        else if(temp<0)
        {
            printf("send err\n");
            close(fd);
            close(client_socket);
            return -1;
        }
        else
        {
            printf("文件末尾\n");
            break;
        }
    }

    printf("文件传输完毕!\n");
    // int ret =0;
    // ret=recv(client_socket,buf,NN,0);
    // printf("%s\n",buf);
    close(fd);
    close(client_socket);

    return 0;
}